/**
 * Created by Administrator on 2017/10/17.
 */
public class MyLinkedListImpl implements MyLinkedList {
    private Node head;

    public MyLinkedListImpl() {
        head = new Node();
    }

    @Override
    public int length() {
        int count=0;
        Node temp = head.getNext();
        while (temp.getNext()!=null){
            temp = temp.getNext();
            count++;
        }
        return count;
    }

    @Override
    public int search(Object item) {
        return 0;
    }

    @Override
    public Object getElement(int index) throws Exception {
        Node temp = head.getNext();
        int i = 0;
        while (temp!=null&&i<index){
            temp = temp.getNext();
            i++;
        }
        if(temp!=null&&i==index){
            return temp.getDate();
        }else {
            throw new Exception("不能获得第"+index+"个元素");
        }
    }

    @Override
    public void insert(int index,Object item) throws Exception {
        Node temp = head.getNext();
        int i = 0;
        if(index==0){//插入元素头
            Node newnode = new Node(item);
            if(temp!=null){//如果列表不为空
                newnode.setNext(temp);//把老的头放到新的头后面
            }
            head.setNext(newnode);//指向新的头
            return;
        }
        while (temp!=null&&i<index-1){//找到要插入元素之前的元素
            temp = temp.next;
            i++;
        }
        if(temp!=null&&i==index-1){//如果找到之前的元素,且元素不为空
            Node next = temp.getNext();//找到要插入位置上原来的元素
            if(next!=null){//如果原来位置上有元素了
                Node newnode = new Node(item,next);//新建一个节点,把next设成原来的元素
                temp.setNext(newnode);//再把节点接到，要插入之前元素的后面
            }else {//如果原来位置上没有元素
                Node newnode = new Node(item);//直接把新建的节点接到之前元素的后面
                temp.setNext(newnode);
            }
        }else {
                throw new Exception("插入位置错误");
        }
    }

    @Override
    public Object remove(int index) throws Exception {
        Node temp = head.getNext();
        int i = 0;
        if(index==0){//删除头元素
            if(temp!=null){//如果列表不为空
                head.setNext(temp.getNext());
                return temp;
            }
            throw new Exception("删除位置不存在元素");
        }
        while (temp!=null&&i<index-1){//找到要删除元素之前的元素
            temp = temp.getNext();
            i++;
        }
        if(temp!=null&&i==index-1&&temp.getNext()!=null){//如果找到之前的元素,且之前的元素和要删除的元素不为空
            Node removenode = temp.getNext();
            temp.setNext(removenode.getNext());
        }else{
            throw new Exception("删除位置不存在元素");
        }
        return temp.getDate();
    }

    @Override
    public boolean isEmpty() {
        if(head.getNext()==null){
            return true;
        }else {
            return false;
        }
    }

    @Override
    public boolean isFull() {
        return false;
    }

    @Override
    public void clear() {

    }

    @Override
    public void display() {
        Node temp = head.getNext();
        while (temp!=null){
            System.out.println(temp.getDate());
            temp = temp.getNext();
        }
    }
}
